\chapter{Java a l'actualitat}

\section{Introducció a Java}
Java és un llenguatge de programació orientat a objectes amb quinze anys
d’història. Va ser creat per Sun Microsystems (recentment absorbida per
Oracle).\\

 Java està pensat per a ser completament multiplataforma (gairebé tots els
 sistemes operatius actuals) i disposa de diferents versions per a diferents
 arquitectures (microelectrònica, ARM, x86, AMD64, etc). Tot això gràcies a la
 seva modularitat.\\

Java té aquestes característiques gràcies al concepte de la màquina virtual ja
que els programes s’executen dins d’aquesta màquina, separant-los completament
de l’arquitectura i el sistema operatiu. Hi ha diferents versions de màquines
virtuals, una per a cada arquitectura/plataforma suportada.\\

Segons la recopilació de dades de diversos portals de codi, Java és el
llenguatge més utilitzat actualment.\\

\begin{figure}[H]
\centering
\includegraphics[width=0.5\textwidth]{imatges/chapter03/java-most-used-language.png}
\caption{Comparació normalitzada de popularitat de diferents llenguatges de
programació, segons www.langpop.com}
\end{figure}

\section{Diferents dispositius}
Així doncs hi ha moltes especificacions o plataformes Java, algunes són
subconjunts d’unes primeres. Altres són totalment diferents i no comparteixen
res més que certes classes abstractes.\\

Això és degut a la varietat de hardware existent en el que es pot executar un
programa fet en Java. No fa falta mencionar les diferències entre un dispositiu
mòbil, un ordinador de sobretaula o una nevera que realitza petites connexions a
internet o controlar la temperatura. Apart d’aquests aspectes la plataforma Java
ha de solucionar i abstreure problemes de hardware: des de tamanys de pantalles,
capacitats gràfiques, capacitats de connexió del dispositiu, capacitats de
processament, mecanismes d’E/S, i molts més aspectes.\\

A  més a més no n’hi ha prou en les diferències de hardware, sinó que també ha
de tenir en compte les diferències en quant a software i les funcionalitats que
aquest software li ofereix. Per exemple, un sistema operatiu pot donar a Java
certs privilegis d’accès a funcionalitats del ‘driver’ d’accès a hardware que en
un altre sistema operatiu és impensable.\\

A tot això se li ha de sumar el fort creixement en l’actualitat de la computació
distribuïda per Internet.\\

En el pròxim apartat s’enumera com la plataforma Java enfoca tots aquests
requisits.\\

\section{Heterogeneïtat de Java}
Com hem dit anteriorment Java es troba disponible en més d’una versió i en
diferents plataformes. Aquesta realitat, la d’un parc molt fragmentat, fa que
desenvolupar aplicacions Java que funcionin a la majoria dels sistemes sigui un
repte quant a usabilitat i accessibilitat ja que una solució comuna no sol ser
la més eficient. El fet de tindre que enfrontar-se a sistemes diferents a l’hora
de desenvolupar una aplicació sempre és un problema.\\

\subsection{J2SE}
J2SE\footnote{Java Standard Edition - http://es.wikipedia.org/wiki/Java\_SE} és
la part de Java destinada als ordinadors de sobretaula. Actualment hi ha JVM’s (Java Virtual Machine(s)) per a Windows, GNU/Linux i OSX, en diverses
arquitectures. Aquesta versió incorpora un conjunt de classes força extens, i a
més la comunitat l’extèn mitjançant llibreries dia a dia. Té moltes facilitats
per a les estructures de dades, gràfics, connexió en xarxa, etc.\\

Tot això permet que sorgeixin aplicacions J2SE d’escriptori realment potents.\\

Encara que la tendència està en fer les aplicacions web, hi ha casos en els
quals fer les aplicacions d’escriptori és l’única opció, degut a les limitacions
del navegador i la connectivitat de la xarxa: latències, permisos, ubicació...\\

Han sorgit eines com GWT que permeten programar dins el paradigma de
les aplicacions d’escriptori en J2SE de tota la vida però que, al ser compilades i
empaquetades, són desplegades en un servidor d’aplicacions. Això ajuda a que
programadors sense experiència en aplicacions J2EE puguin fer aplicacions
basades en web utilitzant les tècniques que han fet anar sempre per aplicacions
d’escriptori.\\

\subsection{J2ME}
J2ME\footnote{Java Mobile Edition -
http://es.wikipedia.org/wiki/Java\_Micro\_Edition} és una versió reduïda de
J2ME. La seva màquina virtual suporta un subconjunt de les operacions que té la versió J2SE. Per exemple, no suporta operacions en punt flotant, en termes de programació, \emph{float}. Això és
degut a que els dispositius per als que esta encarada, tot i ser molt diversos en quant a
hardware, tenen un punt en comú: els seus processadors tenen poca capacitat de
computació i força restriccions hardware per temes de consum d’energia.\\

Per pal·liar els problemes que suposa un rang tan extens de dispositius
l’arquitectura de J2ME és molt modular i proporciona a la plataforma una gran
flexibilitat i adaptació als diferents dispositius. Disposa de cinc nivells:\\

\begin{itemize}
  \item \textbf{Pont amb el Sistema Operatiu}\\Ja que la plataforma no disposa
  d’accès directe a hardware.
  \item \textbf{Màquina Virtual}
  \begin{itemize}
    \item \textbf{KVM}\\Kylobyte Virtual Machine és la màquina virtual per a
    dispositius de -molt- poca potència, com ara dispositius mòbils antics (per exemple de
    fabricació anterior al 2008).
    \item \textbf{CVM}\\Compact Virtual Machine és la màquina virtual per a
    dispositus que tenen una capacitat de computació una mica més elevada i permissiva, com ara PDA’s.
   \end{itemize} 
  \item \textbf{Configuració}\\Són les APIs que interactúen amb les diferents
  VM, oferint diferents funcionalitats que són comunes entre varis dispositius
  per la seva semblança en quant a hardware i capacitats.\\N’hi ha de dos tipus:
  \begin{itemize}
    \item \textbf{CLDC}\\És el conjunt de llibreries que utilitzen els
    dispositius amb KVM. Al tenir limitacions hardware son funcionalitats
    pensades per a treballar en un dispositiu de poca capacitat computacional.
    Aquestes limitacions són per exemple dispositius amb una arquitectura de
    processador de no més de 32 bits, o dispositius que acostumen a funcionar
    sempre mitjançant la bateria i no estan connectats a la corrent. Requereix
    però un mínim de recursos per a poder funcionar: 190KB de memòria RAM mínim
    dedicats a la KVM.
    \item \textbf{CDC}\\És el conjunt de llibreries que utilitzen els
    dispositius amb CVM. Aquestes permeten l'ús de funcionalitats més potents que CLDC ja
    que els dispositius on hi és instalat tenen més capacitat de computació.
    Requereix com a mínim 2MB de memòria RAM dedicats a la CVM. 
   \end{itemize}
  \item \textbf{Perfils}\\Es podria dir que els perfils estan molt poc per sobre
  de la configuració ja que també són un conjunt d’APIs, però aquest cop, més
  restrictives i representen funcionalitats d’un subconjunt més concret que els dispositius de l’anterior punt. Degut al poc ús de CDC en el mercat, només cal mencionar que MIDP (Mobile Information Device) és el perfil més utilitzat.
  \item \textbf{Paquets opcionals o APIs propietàries}\\Són punts d’extensió
  dels perfils i són proporcionats per la plataforma. Generalment són API’s
  funcionals aportades pel fabricant.
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.5\textwidth]{imatges/j2meLayers.jpg}
\caption{Desglosament de les capes de J2ME}
\end{figure}

De la mateixa manera que en una aplicació web, el seu projecte principal
s’anomena EAR (Enterprise Application Project) en J2ME una aplicació
mòbil s’anomena MIDlet (Mobile Information Device + l’equivalent a applet).

\subsection{La preverificació en J2ME}\cite{MEMPRO}
La verificació en Java és un procrès necessari per temes de seguretat.\\

El compilador de la VM corresonent converteix el programari fet en Java a
instruccions bytecode que nomès entèn la VM. Per dir-ho d’alguna manera, dins
d’aquest bytecode estan les operacions binaries push, pop, multiplicacions,
divisions, etc.\\

Un codi compilat podria tenir injectat bytecode perjudicial per la VM o ser
compilat per un compilador ‘no oficial’ i d’aquí neix la verificació, que entre
d’altres aspectes de seguretat, permet controlar els errors en temps d’execució
i llençar-los en forma d’excepció, evitant que la VM o inclús el sistema
operatiu on s’executa es comporti de forma no desitjada.\\

En la versió d’escriptori J2SE la verificació es fa en temps d’execució, moments
abans de carregar el codi a executar el la JVM, sense afectar massa al rendiment
del sistema.\\

En J2ME, degut un altre cop a la limitació de potència dels dispositius,  la
verificació s’ha dividit en dos parts i neix el concepte de la preverificació.\\

La preverificació consisteix en delegar gran part de la responsabilitat de la
verificació a l’entorn de programació. Les eines que tenia la VM per verificar
el codi, són passades a l’SDK de J2ME, permetent que just després de compilar el
codi, es passi un segon constructor, que farà el checkeig de que el bytecode
generat pel compilador compleix amb l’especificació de la JVM, versió Java i més
accions.\\

\subsection{Altres especificacions de Java}
\begin{itemize}
  \item \textbf{J2EE}\\
Internet està de moda. Cada cop més les empreses basen el seu negoci en
aplicacions Web, deixant de bada les aplicacions d’escriptori, costoses de distribuir i de
mantenir.\\

Els creadors de Java ho tenien clar, van fer la versió
Enterprise\footnote{Java Enterprise Edition -
http://es.wikipedia.org/wiki/J2EE}, que conté tot el paquet J2SE i a més a més, incorpora una API per treballar en aplicacions Web.\\

Introdueix el concepte de Servlet, que és un servei escoltant en un port en
concret. En un mateix host pot haver-hi més d’una aplicació i per això sorgiren
els servidors d’aplicacions per a Java. Gràcies a aquest middleware, pots
disposar de múltiples aplicacions independents o inclús que es comuniquen entre
elles, tot en una arquitectura de xarxa.\\

Una aplicació feta en J2EE s’anomena EAR (\emph{Enterprise Application
Project}\footnote{EAR - http://en.wikipedia.org/wiki/EAR\_(file\_format)}).

\item \textbf{Java Card}\\
La versió \emph{Java Card}\footnote{Java Card -
http://es.wikipedia.org/wiki/Java\_Card} de la plataforma Java permet l’execució
de petites aplicacions java (\emph{applets}) en tarjes intel·ligents generalment per a fer petites accions com pagaments, transaccions, i accions en general que necessitin un
software segur i no gens pesat. Un exemple són les targetes GSM, alguns
televisors, neveres, etc.\\
\end{itemize}

\section{Diferents utilitats}
El fet que Java estigui adreçat a un conjunt força important i heterogeni de
dispositius fa que el conjunt d’aplicacions que hi ha implementades, així com el
conjunt d’usuaris que les utilitzen siguin també heterogenis amb pols ben
diferenciats.\\

Per exemple, podem trobar un usuari amb grans coneixements d’informàtica creant
aplicacions per mitjà d’un entorn de desenvolupament que funciona amb Java, com
és el cas d’Eclipse, al seu ordinador; d’altra banda podem observar (i cada dia
més) un usuari accedint al seu correu electrònic\footnote{Gmail app -
http://gmail.com}, visitant una plana web (Opera Mini), o jugant una partida al
seu joc preferit des d’el seu terminal mòbil, tot també gràcies a Java. Fins i tot podem trobar un usuari al seu sofà,
amb el comandament a distància, navegant per un menú ric i interactiu d’una
pel·lícula en format BluRay (J2ME forma part de l’estandard BluRay) al seu
televisor.\\

Queda doncs demostrat que Java apareix a la vida de molta gent i de formes molt
diverses. A més a més la forma i l’entorn en el que aquesta gent interactúa amb
Java també pot ser radicalment diferent.\\

\section{Java a la societat}
Com s’ha dit abans Java és el més utilitzat, a continuació es fa un petit estudi
de com esta la cosa actualment.\\
	
\subsection{Empreses}
Moltes de les empreses del sector IT (Information Technology o Tecnologia de la
Informació) s’han passat a Java gràcies a la seva popularitat. És el cas
d’Oracle, que recentment ha comprat Sun Microsystems, fundadora de Java.\\

Altres empreses que varen apostar fort per Java foren IBM creant l’IDE Eclipse,
que ràpidament van oferir a la comunitat open source i varen treure una versió
comercial basada en Eclipse, WebSphere.\\

La NASA també utilitza Java en les seves missions espacials i en la majoria dels
seus aplicatius.\\

\subsection{Comunitat}
Gairebé tot el paquet Java és Open Source, això ha contribuït a la creació de
fòrums, portals web, repositoris de codi font, etc dedicats a expandir Java.\\

Mitjançant el \emph{Java Community Process}\footnote{JCP -
http://jcp.org/en/home/index}, JCP, les empreses poden sol·licitar definicions d’API per a futures versions de la plataforma.\\

Un dels principals exemples és l’aportació que ha fet durant els darrers anys la
fundació Apache, aportant utilitats que ajuden i molt al desenvolupament
d’aplicacions en Java. També es poden trobar milers de blogs parlant de Java
per internet, cosa que demostra la seva popularitat.\\

\subsection{Projectes}

Els projectes més famosos fets en Java són els propis IDEs per treballar-hi:
Eclipse i Netbeans.\\

La plataforma Android és una clara aposta de com les grans empreses com Google
utilitzen i confien en Java. Es tracta d’un sistema operatiu amb kernel Linux,
filosofia open source i enfocat principalment a dispositius mòbils. La principal
forma de crear aplicacions per a Android és mitjançant el seu SDK Java. Cal
comentar, però, que el codi Java compilat per a Android no genera bytecode
compatible amb altres màquines virtuals Java, ja que utilitza la seva pròpia
implementació tant de la màquina virtual com de les llibreries Java.\\

D’aplicacions que també són molt utilitzades però ningú sap que estan fetes en
Java són els TPV (Terminal Punt de Venda\footnote{TPV -
http://es.wikipedia.org/wiki/Terminal\_punto\_de\_venta}) de multitud de
caixers, tendes, restauració, etc..
